package fiado.tela.pendura;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;

import fiado.bean.Pessoa;
import fiado.dao.sqlserver.PessoaDAO;
import fiado.exception.DaoException;
import fiado.tela.pessoa.TelaPessoa;
import fiado.util.TelaUtil;

public class TelaPendura1 extends JDialog implements ActionListener, MouseListener  {

	private final JPanel contentPanel = new JPanel();
	private JTextField txtNome;
	private JTable table;
	private JScrollPane scrollPane;
	private JButton btnNovaPessoa;
	private JButton btnVoltar;
	private JButton btnBuscar;

	/**
	 * Create the dialog.
	 * @throws DaoException 
	 */
	public TelaPendura1() throws DaoException {
		setSize(new Dimension(800, 600));
		setModal(true);
		setTitle("Selecione uma pessoas");
		montaTela();
		PessoaDAO pessoaDAO = new PessoaDAO();
		List<Pessoa> listaPessoas = pessoaDAO.buscarTodos();
		
		atualizarGrid(listaPessoas);
		
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		TelaUtil.centralizar(this);
		setVisible(true);
	}

	private void atualizarGrid(List<Pessoa> listaPessoas) {
		DefaultTableModel tableModel = (DefaultTableModel) this.table.getModel();
		tableModel.setRowCount(0);
		for (int i = 0; i < listaPessoas.size(); i++) {
			Pessoa p = listaPessoas.get(i);
        	addRecord(tableModel, p);
		}
	}
	
	private void addRecord(DefaultTableModel tableModel, Pessoa p) {
		Object[] listaObject = new Object[6];//colunas
		int c = 0;
		listaObject[c++] = p.getId();
		listaObject[c++] = p.getPrenome();
		listaObject[c++] = p.getSobrenome();
		listaObject[c++] = TelaUtil.dateToString(p.getDataNascimento());
		listaObject[c++] = TelaUtil.dateToString(p.getDataFalecimento());
		listaObject[c++] = p.getSexo()=='M'?"Masculino":"Feminino";
		
		tableModel.addRow(listaObject);
	}
	
	private void montaTela() {
		setBounds(100, 100, 743, 504);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(new BorderLayout(0, 0));
		{
			JPanel filtroPanel = new JPanel();
			contentPanel.add(filtroPanel, BorderLayout.NORTH);
			GridBagLayout gbl_filtroPanel = new GridBagLayout();
			gbl_filtroPanel.columnWidths = new int[]{232, 232, 0};
			gbl_filtroPanel.rowHeights = new int[]{43, 0};
			gbl_filtroPanel.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
			gbl_filtroPanel.rowWeights = new double[]{1.0, Double.MIN_VALUE};
			filtroPanel.setLayout(gbl_filtroPanel);
			{
				JPanel filtroPanelEsq = new JPanel();
				GridBagConstraints gbc_filtroPanelEsq = new GridBagConstraints();
				gbc_filtroPanelEsq.gridwidth = 2;
				gbc_filtroPanelEsq.fill = GridBagConstraints.BOTH;
				gbc_filtroPanelEsq.insets = new Insets(0, 0, 0, 5);
				gbc_filtroPanelEsq.gridx = 0;
				gbc_filtroPanelEsq.gridy = 0;
				filtroPanel.add(filtroPanelEsq, gbc_filtroPanelEsq);
				filtroPanelEsq.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
				{
					JLabel lblNome = new JLabel("Nome : ");
					filtroPanelEsq.add(lblNome);
					lblNome.setAlignmentX(Component.CENTER_ALIGNMENT);
				}
				{
					txtNome = new JTextField();
					filtroPanelEsq.add(txtNome);
					txtNome.setColumns(20);
				}
				{
					btnBuscar = new JButton("Buscar");
					filtroPanelEsq.add(btnBuscar);
				}
			}
			{
				btnNovaPessoa = new JButton("Nova Pessoa");
				GridBagConstraints gbc_btnNovaPessoa = new GridBagConstraints();
				gbc_btnNovaPessoa.insets = new Insets(0, 0, 0, 5);
				gbc_btnNovaPessoa.gridx = 2;
				gbc_btnNovaPessoa.gridy = 0;
				filtroPanel.add(btnNovaPessoa, gbc_btnNovaPessoa);
			}
		}
		{
			scrollPane = new JScrollPane();
			contentPanel.add(scrollPane, BorderLayout.CENTER);
			{
				table = new JTable();
				table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
				scrollPane.setViewportView(table);
				table.setModel(new DefaultTableModel(
					new Object[][] {
						{null, null, null, null, null, null},
					},
					new String[] {
						"ID", "Prenome", "Sobrenome", "Data Nascimento", "Data Falecimento", "Sexo"
					}
				) {
					Class[] columnTypes = new Class[] {
						Integer.class, String.class, String.class, String.class, String.class, String.class
					};
					public Class getColumnClass(int columnIndex) {
						return columnTypes[columnIndex];
					}
					boolean[] columnEditables = new boolean[] {
						false, false, false, false, false, false
					};
					public boolean isCellEditable(int row, int column) {
						return columnEditables[column];
					}
				});
				table.getColumnModel().getColumn(3).setPreferredWidth(96);
				table.getColumnModel().getColumn(4).setPreferredWidth(96);
				{
					JPanel rodapePanel = new JPanel();
					FlowLayout flowLayout = (FlowLayout) rodapePanel.getLayout();
					flowLayout.setAlignment(FlowLayout.RIGHT);
					contentPanel.add(rodapePanel, BorderLayout.SOUTH);
					{
						btnVoltar = new JButton("Voltar");
						rodapePanel.add(btnVoltar);
					}
				}
			}
		}
		btnBuscar.addActionListener(this);
		btnNovaPessoa.addActionListener(this);
		btnVoltar.addActionListener(this);
		table.addMouseListener(this);
	}

	@Override
	public void mouseClicked(MouseEvent event) {
		if (event.getClickCount() == 2) {
			
			int row = table.getSelectedRow();
			DefaultTableModel tableModel = (DefaultTableModel) this.table.getModel();
			int idPessoa = (Integer)tableModel.getValueAt(row, 0);
			
			PessoaDAO pessoaDao = new PessoaDAO();
			try {
				Pessoa pessoa = pessoaDao.buscarPorId(idPessoa);
				new TelaPendura2(pessoa);
				atualizarGrid();
			} catch (DaoException e) {
				JOptionPane.showMessageDialog(this, "Ocorreu um erro ao acessar a base, contate seu fornecedor", "Erro", JOptionPane.ERROR_MESSAGE);	
				e.printStackTrace();
			}
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
	}

	@Override
	public void mouseReleased(MouseEvent e) {
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		try {

			if (event.getSource() == this.btnBuscar) {
				atualizarGrid();
			} else if (event.getSource() == this.btnNovaPessoa) {
				new TelaPessoa(null);
				atualizarGrid();
			} else if (event.getSource() == this.btnVoltar) {
				this.dispose();
			}
		} catch (DaoException e) {
			JOptionPane.showMessageDialog(this, "Ocorreu um erro ao acessar a base, contate seu fornecedor", "Erro", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		} 
	}

	private void atualizarGrid() throws DaoException {
		PessoaDAO pessoaDao = new PessoaDAO();
		String nome = this.txtNome.getText();
		List<Pessoa> listaPessoas = pessoaDao.buscarPorNome(nome);
		atualizarGrid(listaPessoas);
	}
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			TelaPendura1 dialog = new TelaPendura1();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
